package com.dao;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.dao.DataAccessException;

import com.model.Deposito;
import com.model.Usuario;
import com.query.DepositoQuery;
import com.type.RolEnum;
import com.type.TipoDepositoEnum;

public class DepositoDAOImpl extends BaseHibernateDAO<Deposito, DepositoQuery> {

	private BaseModelDAO<Usuario> usuarioDAO;

	@Override
	public Class<Deposito> getModelClass() {
		return Deposito.class;
	}

	@Override
	public List<String> getListNames() {
		List<String> list = new ArrayList<String>();
		list.add("listaSeccionProducto");

		return list;
	}

	/**
	 * Busca los depositos de central o de un cliente en particular
	 * 
	 */
	@SuppressWarnings("unchecked")
	@Override
	public List<Deposito> getList(Object query) throws DataAccessException {
		DepositoQuery depositoQuery = (DepositoQuery) query;
		List<Deposito> list = null;

		DetachedCriteria criteria = DetachedCriteria.forClass(Deposito.class);

		criteria.add(Restrictions.eq("tipoDeposito",
				depositoQuery.getTipoDeposito()));
		if (TipoDepositoEnum.CLIENTE.equals(depositoQuery.getTipoDeposito())) {
			criteria.add(Restrictions.eq("cliente.id",
					depositoQuery.getClienteID()));
		}

		list = (List<Deposito>) getHibernateTemplate().findByCriteria(criteria);
		return list;
	}

	/**
	 * 
	 * Busca los depositos a partir de un usuario
	 * 
	 */
	@Override
	public List<Deposito> getList(String usuario) {

		Usuario usuarioModel = usuarioDAO.get(usuario);

		List<Deposito> listaDepositos = new ArrayList<Deposito>();

		// si encontró el usuario
		if (usuarioModel != null) {

			// Si es de central
			for (RolEnum rol : usuarioModel.getRolEnumList()) {
				if (RolEnum.ROLE_ADMIN.equals(rol)) {
					listaDepositos = getList();
					break;
				} else if (RolEnum.ROLE_CLIENT_OPERATOR.equals(rol)
						|| RolEnum.ROLE_CLIENT_SUPERVISOR.equals(rol)) {

					// traigo todos los depositos del cliente del usuario
					DepositoQuery query = new DepositoQuery(null, null,
							TipoDepositoEnum.CLIENTE, usuarioModel.getCliente()
									.getID());
					listaDepositos.addAll(getList(query));
				} else if (RolEnum.ROLE_CENTRAL_OPERATOR.equals(rol)
						|| RolEnum.ROLE_CENTRAL_SUPERVISOR.equals(rol)) {

					// traigo los depositos de central
					DepositoQuery query = new DepositoQuery(null, null,
							TipoDepositoEnum.CENTRAL, null);
					listaDepositos.addAll(getList(query));
				}
			}
		}

		return listaDepositos;
	}

	public BaseModelDAO<Usuario> getUsuarioDAO() {
		return usuarioDAO;
	}

	public void setUsuarioDAO(BaseModelDAO<Usuario> usuarioDAO) {
		this.usuarioDAO = usuarioDAO;
	}

}
